package com.friendsofed.isometric
{
    import flash.display.Sprite;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    public class IsoWorld extends Sprite
    {
        private var _floor:Sprite;
        private var _objects:Array;
        private var _world:Sprite;
        public function IsoWorld()
        {
            _floor = new Sprite();
            addChild(_floor);
            _world = new Sprite();
            addChild(_world);
            _objects = new Array();
        }
		
		public function get worldLayer():Sprite
		{
			return _world;
		}
		
		public function reset() : void
		{
			for(var i:int = 0;i<_objects.length;i++)
			{
				_world.removeChild(_objects[i]);
			}
			
			_objects = [];
		}
		
		public function addChildToWorld(child:IsoObject):void
		{
			_world.addChild(child);
			_objects.push(child);
			sort();
		}
		
		public function removeChildFromWorld(obj : IsoObject) : void
		{
			_world.removeChild(obj);
			
			for(var i:int = 0;i<_objects.length;i++)
			{
				if(_objects[i] == obj)
				{
					var isoObj : IsoObject = _objects[i];
					_objects[i] = _objects[_objects.length - 1];
					_objects[_objects.length - 1] = isoObj;
					_objects.pop();
					break;
				}
			}
			
			sort();
		}
		
		public function get objects() : Array
		{
			return _objects;
		}
		
		public function addChildToFloor(child:IsoObject):void
		{
		   _floor.addChild(child);
		}
		
		public function removeChildFromFloor(obj : IsoObject) : void
		{
			_floor.removeChild(obj);
		}
		
		public function sort():void
		{
			var list : Array = _objects.slice(0);
			
			var sortItems : Array = [];
			
			for(var i:int=0;i<list.length;++i)
			{
				var nsi:IsoObject = list[i];
				var added : Boolean = false;
				for(var j:int=0;j<sortItems.length;j++)
				{
					var si : IsoObject = sortItems[j];
					
					var start : Point = nsi.depthParam[0];
					var end : Point = si.depthParam[1];
					
					
							if( start.x <= end.x &&  start.y <= end.y )
							{
								sortItems.splice(j,0,nsi);
								added = true;
								break;				
							}
				}
				if(!added){
					sortItems.push(nsi);
				}
			}
			for(var r:int = 0; r < sortItems.length; ++r)
			{
				_world.setChildIndex(sortItems[r], r);
			}
		}
		public function canMove(obj:IsoObject):Boolean
		{
		   var rect:Rectangle = obj.rect;
		   rect.offset(obj.vx, obj.vz);
		   for(var i:int = 0; i < _objects.length; i++)
		   {
				var objB:IsoObject = _objects[i] as IsoObject;
				if(obj != objB && !objB.walkable && rect.intersects(objB.rect))
				{
					return false;
				}
		   }
			return true;
		}
	}
}
